#pragma once
#include <string>
#include <unordered_map>

namespace bitrpc {
    //设置宏替换[key]作为索引，避免混淆
    #define KEY_METHOD      "method"
    #define KEY_PARAMS      "parameters"
    #define KEY_TOPIC_KEY   "topic_key"
    #define KEY_TOPIC_MSG   "topic_msg"
    #define KEY_OPTYPE      "optype"
    #define KEY_HOST        "host"
    #define KEY_HOST_IP     "ip"
    #define KEY_HOST_PORT   "port"
    #define KEY_RCODE       "rcode"
    #define KEY_RESULT      "result"

 
    //[RPC、TOPIC、SERVICE] ： [请求\响应状态]
    enum class MType {
        REQ_RPC = 0,
        RSP_RPC,
        REQ_TOPIC,
        RSP_TOPIC,
        REQ_SERVICE,
        RSP_SERVICE
    };


    //返回状态码
    enum class RCode {
    RCODE_OK = 0,                 // 成功
    RCODE_PARSE_FAILED,           // 解析失败
    RCODE_ERROR_MSGTYPE,          // 错误的消息类型
    RCODE_INVALID_MSG,            // 无效的消息
    RCODE_DISCONNECTED,           // 连接断开
    RCODE_INVALID_PARAMS,         // 无效的参数
    RCODE_NOT_FOUND_SERVICE,      // 未找到服务
    RCODE_INVALID_OPTYPE,         // 无效的操作类型
    RCODE_NOT_FOUND_TOPIC,        // 未找到主题
    RCODE_INTERNAL_ERROR          // 内部错误
    };

    //通过状态码返回对象的字符串信息，便于分析 [状态码： 字符串信息]
    static std::string errReason(RCode code) {
        static std::unordered_map<RCode, std::string> err_map = {
            {RCode::RCODE_OK, "成功处理！"},
            {RCode::RCODE_PARSE_FAILED, "消息解析失败！"},
            {RCode::RCODE_ERROR_MSGTYPE, "消息类型错误！"},
            {RCode::RCODE_INVALID_MSG, "无效消息"},
            {RCode::RCODE_DISCONNECTED, "连接已断开！"},
            {RCode::RCODE_INVALID_PARAMS, "无效的Rpc参数！"},
            {RCode::RCODE_NOT_FOUND_SERVICE, "没有找到对应的服务！"},
            {RCode::RCODE_INVALID_OPTYPE, "无效的操作类型"},
            {RCode::RCODE_NOT_FOUND_TOPIC, "没有找到对应的主题！"},
            {RCode::RCODE_INTERNAL_ERROR, "内部错误！"}
        };
        auto it = err_map.find(code);
        if (it == err_map.end()) {
            return "未知错误！";
        }
        return it->second;
    }

//属于三个功能处理的状态类型

    //RPC指定的处理请求[异步处理、回调处理]
    enum class RType {
            REQ_ASYNC = 0,    // 异步请求
            REQ_CALLBACK      // 回调请求
    };

    //Topic主题订阅 处理状态
    enum class TopicOptype {
        TOPIC_CREATE = 0,
        TOPIC_REMOVE,
        TOPIC_SUBSCRIBE,
        TOPIC_CANCEL,
        TOPIC_PUBLISH
    };

    //Service服务类型 处理状态
    enum class ServiceOptype {
        SERVICE_REGISTRY = 0,  // 服务注册
        SERVICE_DISCOVERY,     // 服务发现
        SERVICE_ONLINE,        // 服务上线
        SERVICE_OFFLINE,       // 服务下线
        SERVICE_UNKNOWN        // 服务未知
    };
}